package com.daleige.common;

import org.apache.commons.lang3.StringUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * @描述 十六进制字符串工具类
 * @创建人 雷文
 * @创建时间 2017-12-14
 */
public class HexStrUtils {
    private static String hexString = "0123456789ABCDEF";

    /**
     *@描述 将16进制数字解码成字节数组,适用于所有字符（包括中文）
     *@参数  [bytes]
     *@返回值  byte[]
     *@创建人  雷文
     *@创建时间  2017-12-14 14:30
     */
    public static byte[] hexToBytes(String bytes){
        if (StringUtils.isEmpty(bytes)) {
            return null;
        }

        byte[] bs = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length() / 2);
        // 将每2位16进制整数组装成一个字节
        for (int i = 0; i < bytes.length(); i += 2) {
            baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString.indexOf(bytes.charAt(i + 1))));
        }
        try {
            bs = baos.toByteArray();
        }catch (Exception e) {
            System.err.println(e);
        }finally {
            try {
                if (baos != null) {
                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bs;
    }

    /**
     *@描述 将字节数组解码成16进制数字适用于所有字符（包括中文）
     *@参数  [bytes]
     *@返回值  java.lang.String
     *@创建人  雷文
     *@创建时间  2017-12-14 14:30
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        // 将字节数组中每个字节拆解成2位16进制整数
        for (int i = 0; i < bytes.length; i++) {
            sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
            sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
        }
        return sb.toString();
    }

    /**
     *@描述 字符转十六进制字符
     *@参数  [str, charsetName]
     *@返回值  java.lang.String
     *@创建人  雷文
     *@创建时间  2018-03-16 14:09
     */
    public static String stringToHex(String str, String charsetName){
        try {
            return bytesToHex(str.getBytes(charsetName));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * str长度小于len时前面补0
     * @param str
     * @param len
     * @return
     */
    public static String getHexString(String str, int len){
        String hexString = Long.toHexString(Long.parseLong(str));
        while (hexString.length() < len){
            hexString = "0" + hexString.toUpperCase();
        }
        return hexString;
    }
}
